#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QStringList>
#include <QList>
#include <QListWidgetItem>
#include "inferenceengine.h"
#include "rulemanager.h"
#include "factmanager.h"
#include "databasemanager.h"
#include <QListWidgetItem>
#include "rule.h"
#include "managementdialog.h"

QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow;
}
QT_END_NAMESPACE

/**
 * @brief 主窗口类，实现动物专家系统的用户界面
 * 
 * 该类负责处理用户交互，包括特征选择、规则加载、推理过程展示等功能。
 * 用户可以通过界面选择特征，加载规则文件，启动推理过程，并查看推理结果。
 */
class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    /**
     * @brief 构造函数，初始化主窗口
     * @param parent 父窗口对象，默认为nullptr
     */
    MainWindow(QWidget *parent = nullptr);
    
    /**
     * @brief 析构函数，释放资源
     */
    ~MainWindow();

private slots:
    /**
     * @brief 添加特征按钮点击事件处理函数
     * 
     * 将用户选择的特征添加到已选特征列表中
     */
    void on_addFeatureButton_clicked();
    
    /**
     * @brief 开始推理按钮点击事件处理函数
     * 
     * 根据用户选择的特征，启动推理引擎进行推理
     */
    void on_startButton_clicked();
    
    /**
     * @brief 重置按钮点击事件处理函数
     * 
     * 清空已选择的特征和推理结果，重置系统状态
     */
    void on_resetButton_clicked();
    
    /**
     * @brief 导入特征按钮点击事件处理函数
     * 
     * 打开文件选择对话框，让用户选择特征文件并加载
     */
    void on_importFeaturesButton_clicked();
    
    /**
     * @brief 导入规则按钮点击事件处理函数
     * 
     * 打开文件选择对话框，让用户选择规则文件并加载
     */
    void on_importRulesButton_clicked();
    
    /**
     * @brief 导入数据库按钮点击事件处理函数
     * 
     * 连接到数据库并导入特征和规则
     */
    void on_importDatabaseButton_clicked();
    
    /**
     * @brief 管理特征和规则按钮点击事件处理函数
     * 
     * 打开管理对话框，允许用户对特征和规则进行增删改查操作
     */
    void on_manageButton_clicked();
    
    /**
     * @brief 特征列表项点击事件处理函数
     * @param item 被点击的特征列表项
     */
    void onFeatureItemClicked(QListWidgetItem *item);
    
    /**
     * @brief 事实添加事件处理函数
     * @param fact 新添加的事实
     */
    void onFactAdded(const QString &fact);
    
    /**
     * @brief 规则变化事件处理函数
     */
    void onRulesChanged();
    
    /**
     * @brief 特征变化事件处理函数
     */
    void onFeaturesChanged();

private:
    /**
     * @brief 更新结果显示区域
     * 
     * 根据当前选择的特征和推理结果，更新界面上的结果显示
     */
    void updateResultDisplay();
    

    
    /**
     * @brief 更新动态数据库显示
     * 
     * 在界面上显示当前事实库中的所有事实
     */
    void updateDynamicDatabaseDisplay();
    
    /**
     * @brief 更新推理过程显示
     * @param step 推理步骤的描述信息
     * 
     * 在界面上显示推理过程中的每一步，包括应用的规则和推导出的新事实
     */
    void updateInferenceProcessDisplay(const QString &step);
    
    /**
     * @brief 从文件导入特征
     * @param filePath 特征文件的路径
     * 
     * 解析特征文件，将特征添加到特征列表中
     */
    void importFeaturesFromFile(const QString &filePath);
    
    /**
     * @brief 从文件导入规则
     * @param filePath 规则文件的路径
     * 
     * 解析规则文件，将规则添加到规则库中
     */
    void importRulesFromFile(const QString &filePath);
    
    /**
     * @brief 连接到数据库
     * @param hostname 数据库服务器地址
     * @param databaseName 数据库名称
     * @param username 用户名
     * @param password 密码
     * @return 如果连接成功则返回true，否则返回false
     */
    bool connectToDatabase(const QString &hostname, const QString &databaseName, 
                          const QString &username, const QString &password);
    
    /**
     * @brief 从数据库导入特征
     * @return 如果导入成功则返回true，否则返回false
     */
    bool importFeaturesFromDatabase();
    
    /**
     * @brief 从数据库导入规则
     * @return 如果导入成功则返回true，否则返回false
     */
    bool importRulesFromDatabase();
    
    // UI界面对象
    Ui::MainWindow *ui;
    
    // 规则管理器，负责管理规则库
    RuleManager *m_ruleManager;
    
    // 事实管理器，负责管理事实库
    FactManager *m_factManager;
    
    // 推理引擎，负责执行推理过程
    InferenceEngine *m_inferenceEngine;
    
    // 数据库管理器，负责数据库连接和操作
    DatabaseManager *m_dbManager;
    
    // 用户选择的特征列表
    QStringList m_selectedFeatures;
};
#endif // MAINWINDOW_H
